import Vue from 'vue';
import NProgress from 'nprogress'; // Progress 进度条
import Router from 'vue-router';

import baseRouter from './baseRouter';
import store from '@/store/index.js';
import { getSid as getToken } from '@/common/auth.js';
import config from '@/common/config';

Vue.use(Router);

const router = new Router(baseRouter);

// 免登陆白名单
const whiteList = config.menu.whiteList || []; // 不重定向白名单

let isAuthentication = config.menu.isAuthentication;

if (process.env.NODE_ENV !== 'development') {
  isAuthentication = true;
}

router.beforeEach((to, from, next) => {
  NProgress.start(); // 开启Progress

  // 不开启认证直接全部通过
  if (!isAuthentication) {
    next();
    return;
  }

  if (whiteList.indexOf(to.path) !== -1) {
    // 在免登录白名单，直接进入
    next();
  } else {
    if (getToken()) {
      // 判断是否有token
      if (to.path === '/login') {
        next({ path: '/' });
      } else {
        if (store.getters['base/menu/g_addRouters'].length === 0) {
          // 判断当前用户是否已拉取完user_info信息
          store
            .dispatch('base/user/load')
            .then(info => {
              let addRouters = store.getters['base/menu/g_addRouters'];
              console.log(router);
              router.addRoutes(addRouters); // 动态添加可访问路由表
              next({ ...to }); // hack方法 确保addRoutes已完成
            })
            .catch(() => {
              // store.dispatch('FedLogOut').then(() => {
              //   next({ path: '/login' });
              // });
            });
        } else {
          //  else {
          //   // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓
          //   if (hasPermission(store.getters.roles, to.meta.role)) {
          //     next();//
          //   } else {
          next();
          //   }
          //   // 可删 ↑
        }
      }
    } else {
      next('/login'); // 否则全部重定向到登录页
      // NProgress.done(); // 在hash模式下 改变手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps：history模式下无问题，可删除该行！
    }
  }
});

router.afterEach(() => {
  NProgress.done(); // 结束Progress
});

export default router;
